home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / nodelete / part01
Encoding:
Internet Message Format  |  1991-03-14  |  25.5 KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i056: NoDelete 1.4 - intercept DeleteFile() requests, Part01/01
  4. Reply-To: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i056@ab20.larc.nasa.gov>
  7. Date: 14 Mar 91 00:39:57 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga.misc
  11.  
  12. Submitted-by: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
  13. Posting-number: Volume 91, Issue 056
  14. Archive-name: utilities/nodelete-1.4/part01
  15.  
  16. [ includes uuencoded executable  ...tad ]
  17.  
  18. I  wrote  this  program  mainly  to  make  the fantastic public domain game
  19. "Omega"  more  enjoyable  to  play.   The author of this program thought it
  20. reasonable to have the system unlink the save-file after having reloaded it
  21. to  somehow  "simulate the continuity of character".  Too bad that NoDelete
  22. does not work correctly with this program...
  23. Footnote: It works now!
  24.  
  25.                               WHAT IT DOES
  26. NoDelete  enables  you  erraneous  humans  to  once  again  reflect  on the
  27. righteousness  of  your  decisions  concerning  the  deleting  of  files on
  28. AmigaDos devices.  If you try to delete a file or a program tries to remove
  29. it,  this  is  mostly  done  via  DeleteFile()  of  the  dos.library.  When
  30. executed,  NoDelete  bends  this  vector to its own routine which brings up
  31. this  cute  little requester on the active window.  This requester contains
  32. the  name  of  the file that the system is trying to delete.  If you really
  33. want  to  delete  this  file,  click to the "Yes, Delete!" gadget.  If not,
  34. click  to the "Oops, no way!"-Gadget of the requester.  NoDelete works just
  35. fine   with   aliases,   wildcards   etc.   For  problems  see  the  "known
  36. bugs"-section of this text.
  37.  
  38. #!/bin/sh
  39. # This is a shell archive.  Remove anything before this line, then unpack
  40. # it by saving it into a file and typing "sh file".  To overwrite existing
  41. # files, type "sh file -c".  You can also feed this as standard input via
  42. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  43. # will see the following message at the end:
  44. #        "End of archive 1 (of 1)."
  45. # Contents:  nodelete.c nodelete.doc nodelete.uu
  46. # Wrapped by tadguy@ab20 on Wed Mar 13 19:39:55 1991
  47. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  48. if test -f 'nodelete.c' -a "${1}" != "-c" ; then 
  49.   echo shar: Will not clobber existing file \"'nodelete.c'\"
  50. else
  51. echo shar: Extracting \"'nodelete.c'\" \(6661 characters\)
  52. sed "s/^X//" >'nodelete.c' <<'END_OF_FILE'
  53. X/* NoDelete V1.4E (C) HooverSoft 1990
  54. X
  55. X    cc NoDelete +L
  56. X    ln NoDelete -lc32
  57. X
  58. X
  59. X*/
  60. X
  61. X
  62. X#ifdef AZTEC_C                    /* Works under Manx, convert it to Lattice */
  63. X                                    /* if you don't mind the hassle...             */
  64. X
  65. X#include<intuition/intuition.h>
  66. X#include<intuition/intuitionbase.h>
  67. X#include<libraries/dos.h>
  68. X#include<libraries/dosextens.h>
  69. X#include<stdio.h>
  70. X/* #define DEBUG 1 */
  71. X
  72. Xchar bodystring[80],extensions[10][10], titlebak[80], title[80];
  73. XULONG answer, EXT_SET = 0L,  howmany = 0L;
  74. XUBYTE *position, *rindex();
  75. XULONG OVERRIDE = 0L, SILENT = 0L;
  76. X
  77. Xstruct FileHandle *output, *Output();
  78. X
  79. Xstruct NewWindow mywindow = {
  80. X    100,0,    /* window XY origin relative to TopLeft of screen */
  81. X    350,10,    /* window width and height */
  82. X    0,1,    /* detail and block pens */
  83. X    CLOSEWINDOW+VANILLAKEY,    /* IDCMP flags */
  84. X    WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+SIMPLE_REFRESH,    /* other window flags */
  85. X    NULL,    /* first gadget in gadget list */
  86. X    NULL,    /* custom CHECKMARK imagery */
  87. X    (UBYTE *)title,    /* window title */
  88. X    NULL,    /* custom screen pointer */
  89. X    NULL,    /* custom bitmap */
  90. X    5,5,    /* minimum width and height */
  91. X    640,110, /* maximum width and height */
  92. X    WBENCHSCREEN    /* destination screen type */
  93. X    };
  94. X
  95. X
  96. Xstruct IntuiText body = {
  97. X    1,0,
  98. X    JAM1|COMPLEMENT,
  99. X    30,16,
  100. X    NULL,
  101. X    NULL,
  102. X    NULL
  103. X    };
  104. X
  105. Xstruct IntuiText fbody = {
  106. X    1,0,
  107. X    JAM1|COMPLEMENT,
  108. X    30,5,
  109. X    NULL,
  110. X    (UBYTE *) "System tries to fool around...",
  111. X    &body
  112. X    };
  113. X
  114. Xstruct IntuiText ok = {
  115. X    1,0,
  116. X    JAM1|COMPLEMENT,
  117. X    6,3,
  118. X    NULL,
  119. X    (UBYTE *)    "Yes, Delete!",
  120. X    NULL
  121. X    };
  122. X
  123. Xstruct IntuiText no = {
  124. X    1,0,
  125. X    JAM1|COMPLEMENT,
  126. X    6,3,
  127. X    NULL,
  128. X    (UBYTE *)  "Oops, No Way!",
  129. X    NULL
  130. X    };
  131. X
  132. X
  133. Xstruct IntuiMessage *msg, *GetMsg();
  134. X
  135. Xstruct IntuitionBase *IntuitionBase;
  136. Xstruct Window            *mw, *aw, *OpenWindow();
  137. Xstruct Library            *DosBase;
  138. XUBYTE                        *filename;
  139. Xvoid                         *OpenLibrary();
  140. Xstruct Task                *FindTask();
  141. X
  142. Xvoid NoDelete()
  143. X{
  144. X#asm
  145. X    public    _LVOSetProtection
  146. X
  147. X    movem.l    d0-d7/a0-a6,-(sp)
  148. X#endasm
  149. X    geta4();
  150. X#asm
  151. X    move.l    d1,_filename
  152. X#endasm
  153. X
  154. X    if(EXT_SET)
  155. X        {
  156. X
  157. X        position = rindex(filename, '.');
  158. X        if(!position)
  159. X            goto delete_anyway;
  160. X        else
  161. X            {
  162. X            for(answer=0L; answer < howmany; answer++)            
  163. X                {
  164. X                if( (strcmp( (UBYTE *) position, (UBYTE *) extensions[answer])) != 0L)
  165. X                    continue;
  166. X                else
  167. X                    goto request;
  168. X                }
  169. X            }
  170. X        goto delete_anyway;        
  171. X        }    
  172. Xrequest:
  173. X    strcpy(bodystring, "Delete File `");
  174. X    strcat(bodystring, (char *)filename);
  175. X    strcat(bodystring, "'?");
  176. X    body.IText = (UBYTE *) bodystring;
  177. X    aw = (struct Window *) IntuitionBase->ActiveWindow;
  178. X    answer = (long)AutoRequest(aw, &fbody, &ok, &no, NULL, NULL, 360L, 61L);
  179. X    if(!answer)
  180. X    {
  181. X        ;
  182. X#asm
  183. X    movem.l    (sp)+,d0-d7/a0-a6
  184. X    move.l    #1,d0
  185. X#endasm
  186. X    return;
  187. X    }
  188. X
  189. X    if(answer)
  190. X    {
  191. X
  192. Xdelete_anyway:
  193. X        ;
  194. X#asm
  195. X
  196. X        move.l    _DosBase,a6        
  197. X        move.l    #$70f7,d0            ;restore old vector
  198. X        move.w    d0,-72(a6)
  199. X        move.l    #$60000092,d0
  200. X        move.l    d0,-70(a6)
  201. X        
  202. X        tst.l        _OVERRIDE
  203. X        beq.s        _dont_unprotect
  204. X
  205. X        move.l    _filename,d1
  206. X
  207. X
  208. X        move.l    #0,d2
  209. X        jsr        _LVOSetProtection(a6)
  210. X
  211. X_dont_unprotect:
  212. X
  213. X        move.l    _filename,d1
  214. X        jsr        -72(a6)                ;DeleteFile() call
  215. X#endasm
  216. X
  217. X        ;
  218. X
  219. X        SetFunction(DosBase, -72L, &NoDelete);
  220. X
  221. X/* install our function */
  222. X
  223. X
  224. X#asm
  225. X        movem.l    (sp)+,d0-d7/a0-a6
  226. X        move.l    #1,d0
  227. X#endasm
  228. X        return;
  229. X        }
  230. X    }
  231. X        
  232. X
  233. Xvoid quit(why)
  234. XUBYTE *why;
  235. X{
  236. X    if(!SILENT)
  237. X        Write(output, why, (ULONG) strlen(why) );
  238. X    SetTaskPri((struct Task *)FindTask(0L), 0L);
  239. X    if(DosBase)
  240. X    {
  241. X        ;
  242. X#asm
  243. X        move.l    _DosBase,a6        
  244. X        move.l    #$70f7,d0            ;restore old vector
  245. X        move.w    d0,-72(a6)
  246. X        move.l    #$60000092,d0
  247. X        move.l    d0,-70(a6)
  248. X#endasm
  249. X        ;
  250. X    }
  251. X
  252. X    if    (mw)
  253. X        CloseWindow(mw);
  254. X
  255. X    if (DosBase)    
  256. X        CloseLibrary(DosBase);
  257. X
  258. X    if (IntuitionBase)
  259. X        CloseLibrary(IntuitionBase);
  260. X
  261. X    exit(0L);
  262. X}
  263. X
  264. X/* test_nd() tests the DeleteFile vector to see if NoDelete is already 
  265. X    installed. Returns zero if NoDelete is installed, one if it is not.
  266. X*/
  267. X#asm
  268. X        public    _test_nd
  269. X_test_nd:
  270. X
  271. X        move.l    _DosBase,a6
  272. X        cmpi.l    #$60000092,-70(a6)
  273. X        bne.s        _is_there                
  274. X        moveq        #1,d0
  275. X        bra.s        _fuckoff
  276. X_is_there:
  277. X        moveq        #0,d0
  278. X_fuckoff:
  279. X        rts    
  280. X#endasm
  281. Xvoid main(argc,argv)
  282. Xlong argc;
  283. Xchar *argv[];
  284. X    {
  285. X
  286. X    static UBYTE *msg1 = (UBYTE *)"Installing NoDelete...";
  287. X    static UBYTE *msg2 = (UBYTE *)"done. NoDelete V1.4E (c) HooverSoft 1990\n\n";
  288. X    long i;
  289. X
  290. X    DosBase = (struct Library *) OpenLibrary("dos.library",0L);
  291. X    output = Output();
  292. X    strcpy(title, (UBYTE *) "NoDelete V1.4E (c) HooverSoft");
  293. X    
  294. X    if(argc > 11)
  295. X        quit("Sorry, only 10 extensions allowed!\n");
  296. X
  297. X    if(argc >= 2)
  298. X        {
  299. X        for(i=1; i<argc; i++)
  300. X            {
  301. X    
  302. X            if(argv[i][0] == '.')
  303. X                {
  304. X                EXT_SET = 1L;
  305. X                strcpy(extensions[howmany], argv[i]);
  306. X                howmany++;
  307. X                }
  308. X            else
  309. X             continue;
  310. X
  311. X#ifdef    DEBUG
  312. X            printf("Copied %s, Result: %s\n", argv[i], extensions[i-1L]);
  313. X#endif    
  314. X            }
  315. X
  316. X#ifdef    DEBUG
  317. X        printf("I found %ld extensions.\n", howmany);
  318. X#endif            
  319. X
  320. X
  321. X        if(howmany)
  322. X                strcat(title, (UBYTE *) " EXT SET");            
  323. X
  324. X        for(i=1; i<argc; i++)
  325. X            {
  326. X#ifdef DEBUG
  327. X            printf("Scanning argv[%ld]: %s\n", i, (UBYTE *) argv[i] );
  328. X#endif
  329. X            if( (char) argv[i][0] == '-')
  330. X                switch( (char) argv[i][1] )
  331. X                    {
  332. X                    case 'y':    if( atoi(argv[i+1]) <= 245L)
  333. X                                        mywindow.TopEdge = atoi(argv[i+1]);
  334. X                                     break;
  335. X
  336. X                    case 'p':    if(atoi(argv[i+1]) < 10L && atoi(argv[i+1]) > -20L)
  337. X                                        SetTaskPri((struct Task *)FindTask(0L),\
  338. X                                                        (long)atoi(argv[i+1]));
  339. X                                    else
  340. X                                        SetTaskPri((struct Task *)FindTask(0L), -5L);
  341. X                                    break;
  342. X
  343. X                    case  'O':    OVERRIDE = 1L;
  344. X                                    break;
  345. X                
  346. X                    case  'S':    SILENT = 1L;
  347. X                                    break;
  348. X                
  349. X                    case default: break;
  350. X                    }
  351. X                /* end switch */
  352. X            /*end if */
  353. X        /*end for */
  354. X            }    
  355. X                    
  356. X        }
  357. X
  358. X    if(!howmany)
  359. X        {
  360. X        EXT_SET = 0L;
  361. X        strcat(title, (UBYTE *) " NO EXT");
  362. X        }
  363. X
  364. X/* calculate dimension of TitleBar */
  365. X
  366. X    mywindow.Width = ( strlen(title) * 8L) + 85L;
  367. X    mywindow.LeftEdge = (640L-mywindow.Width) / 2L;
  368. X
  369. X    IntuitionBase =  OpenLibrary("intuition.library",0L);
  370. X    if(!SILENT)
  371. X        Write(output, msg1, (ULONG)strlen(msg1));
  372. X
  373. X    if( !test_nd() && !SILENT )
  374. X        {
  375. X        Write(output, "NoDelete already installed.\n",28L);
  376. X        CloseLibrary(DosBase);
  377. X        CloseLibrary(IntuitionBase);
  378. X        exit(0L);
  379. X        }
  380. X
  381. X    mw = OpenWindow(&mywindow);
  382. X    if(!mw)
  383. X        quit("Could not open Window.\n\n");
  384. X    if(!SILENT)
  385. X        Write(output, msg2, (ULONG)strlen(msg2));
  386. X
  387. X    SetFunction(DosBase, -72L, &NoDelete); 
  388. X
  389. X    for(;;)
  390. X        {
  391. X        Wait(1L << mw->UserPort->mp_SigBit);
  392. Xgetmsg:
  393. X        msg = GetMsg(mw->UserPort);
  394. X        ReplyMsg(msg);
  395. X        if (msg->Class == CLOSEWINDOW)
  396. X            quit("NoDelete V1.4E exiting.\n\n");
  397. X        if(msg->Class == VANILLAKEY)
  398. X            {
  399. X            strcpy(titlebak, (UBYTE *) "Extensions: ");
  400. X            for(i=0L; i < howmany ; i++)
  401. X                {
  402. X                strcat(titlebak, extensions[i]);
  403. X                strcat(titlebak, " ");
  404. X                }
  405. X            SetWindowTitles(mw, titlebak);
  406. X            Wait(1L << mw->UserPort->mp_SigBit);
  407. X            SetWindowTitles(mw, title);
  408. X            ReplyMsg( GetMsg(mw->UserPort) );
  409. X            }
  410. X
  411. X        else
  412. X            continue;
  413. X        }
  414. X    }
  415. X#endif    
  416. X    
  417. END_OF_FILE
  418. if test 6661 -ne `wc -c <'nodelete.c'`; then
  419.     echo shar: \"'nodelete.c'\" unpacked with wrong size!
  420. fi
  421. # end of 'nodelete.c'
  422. fi
  423. if test -f 'nodelete.doc' -a "${1}" != "-c" ; then 
  424.   echo shar: Will not clobber existing file \"'nodelete.doc'\"
  425. else
  426. echo shar: Extracting \"'nodelete.doc'\" \(8113 characters\)
  427. sed "s/^X//" >'nodelete.doc' <<'END_OF_FILE'
  428. X *************************************************************************
  429. X *              NoDelete V1.4  (C) HooverSoft  Oct 30th, 1990            *
  430. X *************************************************************************
  431. X
  432. XUSAGE:    1> run NoDelete [extensions] [-p priority] [-y ypos] <ENTER>
  433. X            from CLI only.
  434. X
  435. X
  436. X
  437. X
  438. X                                  HISTORY
  439. X
  440. X                     CHANGES TO VERSION 1.35: OCT 1990
  441. XProgrammed  two  new options -O and -S (Cheers, John!).  These options sort
  442. Xof  "fix"  a  bug whith NoDelete which used to override the file protection
  443. Xbit.
  444. X
  445. X                     CHANGES TO VERSION 1.3: SEP 1990
  446. XLots  of  changes.   Thinking  of  writing  a  new  documentation.  Anyway,
  447. Xintroduced  command line options -p and -y for run-time setting of priority
  448. Xof NoDelete and of vertical position of titlebar.
  449. X
  450. X                     CHANGES TO VERSION 1.2: AUG 1990
  451. XIntroduced  the  possibilty  to give multiple extensions on startup.  Lists
  452. Xextensions when pressing a key while Nodelete's titlebar is active.
  453. X
  454. X                     CHANGES TO VERSION 1.1: Aug 1990
  455. XNoDelete now automatically centers the Dragbar on Screen and calculates the
  456. Xcorrect width for the window if a extension is specified.
  457. X
  458. XNow  works  fine  with  AmiOmega.   System won't crash if "Yes, Delete!" is
  459. Xselected.
  460. X
  461. XNow  supports  the  use of extensions to ask confirmations only for special
  462. Xfiles  ending  in  defined  extension.  Will show the selected extension in
  463. Xwindow's titlebar.
  464. X
  465. XNoDelete  now  checks  if  another  NoDelete is already active and exits if
  466. Xtrue.
  467. X
  468. X                     CHANGES TO VERSION 1.01: Jul 1990
  469. XNow handles protected Files correctly.  Previous version didn't complain if
  470. Xfile was delete protected.
  471. X
  472. XNoDelete sets its priority to a value of -5 directly after startup.
  473. X
  474. X                    CHANGES TO VERSION 1.00: June 1990
  475. XVersion  1.01  now  restores  the  Dos Vector relative to _DosBase, so this
  476. Xprogram  should  work under Kickstart 1.3 as well.  If someone already uses
  477. XKick 2.0, he or she should let me know if NoDelete works with that.  I have
  478. Xheard  that  the  funny  instructions  in DosBase have been replaced with a
  479. Xregular jump table.
  480. X
  481. X
  482. X                           WHY USE NODELETE?
  483. XI  wrote  this  program  mainly  to  make  the fantastic public domain game
  484. X"Omega"  more  enjoyable  to  play.   The author of this program thought it
  485. Xreasonable to have the system unlink the save-file after having reloaded it
  486. Xto  somehow  "simulate the continuity of character".  Too bad that NoDelete
  487. Xdoes not work correctly with this program...
  488. XFootnote: It works now!
  489. X
  490. X                              WHAT IT DOES
  491. XNoDelete  enables  you  erraneous  humans  to  once  again  reflect  on the
  492. Xrighteousness  of  your  decisions  concerning  the  deleting  of  files on
  493. XAmigaDos devices.  If you try to delete a file or a program tries to remove
  494. Xit,  this  is  mostly  done  via  DeleteFile()  of  the  dos.library.  When
  495. Xexecuted,  NoDelete  bends  this  vector to its own routine which brings up
  496. Xthis  cute  little requester on the active window.  This requester contains
  497. Xthe  name  of  the file that the system is trying to delete.  If you really
  498. Xwant  to  delete  this  file,  click to the "Yes, Delete!" gadget.  If not,
  499. Xclick  to the "Oops, no way!"-Gadget of the requester.  NoDelete works just
  500. Xfine   with   aliases,   wildcards   etc.   For  problems  see  the  "known
  501. Xbugs"-section of this text.
  502. X
  503. X                                EXTENSIONS
  504. XLots  of  programs,  programmers  and normal people use extensions in their
  505. Xfile system to be able to immediately make out the contents of a file.  For
  506. Xexample,  ".c"  specifies  the file to be a C source code and ".bas" should
  507. Xcontain  a  basic  program's  source.   There  are  tons of frequently used
  508. Xextensions,  from  ".asm"  up to ".cfg".  If you use NoDelete and you don't
  509. Xwant  the  system to get on your nerves by confirming EVERY rm command, you
  510. Xshould  use a certain extension on NoDelete's command line to tell NoDelete
  511. Xthat  it  should  only  ask  confirmation for those precious ".c" or ".iff"
  512. Xfiles and let all others alone.
  513. X
  514. XThe command line
  515. X
  516. X        1> run nodelete .c
  517. X
  518. Xwould  tell NoDelete to only intercept the removing of files ending in ".c"
  519. Xand not to worry about any other files that are removed from the device.
  520. X
  521. XYou can specifiy up to ten extensions when running NoDelete. The command
  522. X
  523. X        1> run NoDelete .c .iff .tex .asm
  524. X
  525. Xwill  make  NoDelete  complain  about  any  file  which  ends in one of the
  526. Xspecified  extensions  and  leave  all others alone.  If you have forgotten
  527. Xwhich  extensions  you  specified  at  startup,  just  activate  NoDelete's
  528. Xtitlebar  and  press any key.  NoDelete will then give a list of extensions
  529. Xin the titlebar until another key is pressed.
  530. X
  531. X
  532. X
  533. X                           COMMAND LINE OPTIONS
  534. XFinally,  HooverSoft  is  proud  to have introduced command line options in
  535. XNoDelete.  So far, four options are supported:
  536. X
  537. X-p    number    where number is an integer between -20 and 9. If given on
  538. X                the command line, NoDelete will set its priority to this
  539. X                value.  If you type rubbish or use values not allowed, the
  540. X                default priority of -5 is set.
  541. X
  542. X-y ypos        where ypos is an integer ranging from zero to 245 (sorry,
  543. X                all you NTSC users...).  This number will determine the ver-
  544. X                tical position of NoDelete's titlebar.  if you try to fool
  545. X                NoDelete or do not give this option, the default value zero
  546. X                (top of screen) is used.
  547. X
  548. X-O                Override file protection bit. If this option is given,
  549. X                NoDelete will NOT care about the file's protection status.
  550. X                This option is sort of dangerous, but I think I you are
  551. X                explicitly asked wether you want to delete a file this
  552. X                should be presto! wiped off the disk without return or
  553. X                any other chance of survival..., Anyway, the default now
  554. X                is to consider and respect the file protection.
  555. X
  556. X-S                if given, this option tells NoDelete to shut up. No screams,
  557. X                no comments!
  558. X
  559. X                               KNOWN BUGS
  560. XNoDelete  cannot  take  care of the AmigaDos command Delete.  God knows how
  561. Xthis command erases a disk file...
  562. X
  563. XThe  Shell  won't complain if you try to delete any non-existent file while
  564. XNoDelete  has  its  grip  on  the system.  This is not really a bug because
  565. XNoDelete  works  on  this  basis  of  cheating  the  calling  function  and
  566. Xpretending that everything is just fine and deleted. This also is the cause
  567. Xthat the calling program will not be informed if the file in question
  568. Xis delete protected.
  569. X
  570. XSometimes  it is possible to get two copies of NoDelete running at the same
  571. Xtime.   I  can't  explain  how  this is to be done, but somehow it works...
  572. XAnyway this happens very seldomly.
  573. X
  574. X                            THE LEGAL STUFF
  575. XNoDelete  is  Public Domain and may be copied freely by everyone except for
  576. Xpurposes  listed below as long as this notice is left intact.  This program
  577. Xis  copyright  (C)  by  HooverSoft.   It  may  NOT  be  copied  or sold for
  578. Xcommercial  purposes  without  written  permssion  by the author (Get lost,
  579. XCarsten Wolf and all you other suckers!).  It may be distributed and copied
  580. Xfreely for non-commercial purposes only.
  581. X
  582. XWhen  distributed,  this program should always be accompanied by this file,
  583. Xthe documentation.
  584. X
  585. X                    FURTHER PLANS & HOPELESS DREAMS
  586. XI  would  like  to use CreateTask() to launch a separate Task for Nodelete.
  587. XThis would unlink NoDelete's memory requirements from the current stacksize
  588. Xof  the  system.  It would be nice if "delete" could also be disabled but I
  589. Xam not sure how to do this.
  590. X
  591. X                            PUBLIC FEEDBACK
  592. XBug  reports  (cheers, Jensi & John!), criticism, comments and approvements
  593. Xshould be sent to
  594. X                        
  595. X                SNAIL:
  596. X                              HooverSoft Inc.
  597. X                            Joellenbecker Weg 4
  598. X                               4900 Herford
  599. X
  600. X                BITNET:            
  601. X                          hoover@math4.uni-bielefeld.de
  602. X
  603. X                                DISCLAIMER
  604. XDo  whatever you like with this program, but listen:  you can't blaim it on
  605. Xme if anything goes down the drain! 
  606. X
  607. XHave fun & God bless you, Hoover
  608. END_OF_FILE
  609. if test 8113 -ne `wc -c <'nodelete.doc'`; then
  610.     echo shar: \"'nodelete.doc'\" unpacked with wrong size!
  611. fi
  612. # end of 'nodelete.doc'
  613. fi
  614. if test -f 'nodelete.uu' -a "${1}" != "-c" ; then 
  615.   echo shar: Will not clobber existing file \"'nodelete.uu'\"
  616. else
  617. echo shar: Extracting \"'nodelete.uu'\" \(6607 characters\)
  618. sed "s/^X//" >'nodelete.uu' <<'END_OF_FILE'
  619. Xbegin 644 nodelete
  620. XM```#\P`````````#``````````(```0I````O`````$```/I```$*4[Z""13%
  621. XM>7-T96T@=')I97,@=&\@9F]O;"!A<F]U;F0N+BX``%EE<RP@1&5L971E(0``P
  622. XM3V]P<RP@3F\@5V%Y(0!.50``2.?__DZZ"$XI08*:2JR``F=22'@`+B\L@II.S
  623. XMN@;84$\I0()^2JR"?F<``+1"K()Z8"9R"B`L@GI.N@YF0>R!=M"(+P`O+()^G
  624. XM3KH':%!/2H!F`F`04JR">B`L@GJPK(`&9=!@>DAZ`,9(;($F3KH&IE!/+RR"^
  625. XMFDAL@29.N@KR4$](>@"X2&R!)DZZ"N103T'L@28I2(!.(&R"BBEH`#2"DDAX&
  626. XM`#U(>`%H0J="ITAL@'Y(;(!J2&R`5B\L@I).N@]63^\`("E`@GI*K()Z9@I,?
  627. XMWW__<`%.74YU2JR">F=,+&R"EB`\``!P]SU`_[@@/&```)(M0/^Z2JR`"F<*M
  628. XM(BR"FG0`3J[_1B(L@II.KO^X2'K^[$AX_[@O+(*63KH.ED_O``Q,WW__<`%@"
  629. XMJF"H1&5L971E($9I;&4@8``G/P``3E4``$JL@`YF'"\M``A.N@766$\O`"\MM
  630. XM``@O+(*"3KH-L$_O``Q"IT*G3KH-[%A/+P!.N@Y44$]*K(*69Q@L;(*6(#P`!
  631. XM`'#W/4#_N"`\8```DBU`_[I*K(*.9PHO+(*.3KH.DEA/2JR"EF<*+RR"EDZZZ
  632. XM#8A83TJL@HIG"B\L@HI.N@UX6$]"ITZZ"TY83TY=3G4L;(*6#*Y@``"2_[IFD
  633. XM!'`!8`)P`$YU3E7__$*G2'H$.$ZZ#9Q03RE`@I9.N@SV*4""@DAZ!"Y(;((JK
  634. XM3KH%"%!/#*T````+``AO"DAZ!#).NO\>6$\,K0````(`"&T``;`K?`````'_%
  635. XM_&!*("W__.6`(&T`#")P"``,$0`N9C(I?`````&``B`M__SE@"!M``PO,`@`^
  636. XM<@H@+(`&3KH,-$'L@7;0B"\`3KH$G%!/4JR`!E*M__P@+?_\L*T`"&VL2JR`"
  637. XM!F<.2'H#W$AL@BI.N@C04$\K?`````'__&```28@+?_\Y8`@;0`,(G`(``P1B
  638. XM`"UF``$,("W__.6`(&T`#")P"``0*0`!2(!(P&```-`@+?_\4H#E@"!M``PO!
  639. XM,`@`3KH$1EA/L+P```#U;AH@+?_\4H#E@"!M``PO,`@`3KH$*%A/.4"`%&``A
  640. XM`+8@+?_\4H#E@"!M``PO,`@`3KH$"EA/L+P````*;$@@+?_\4H#E@"!M``POC
  641. XM,`@`3KH#[%A/L+S____L;RH@+?_\4H#E@"!M``PO,`@`3KH#SEA/+P!"ITZZC
  642. XM"^183R\`3KH,3%!/8!1(>/_[0J=.N@O.6$\O`$ZZ##903V`X*7P````!@`I@C
  643. XM+BE\`````8`.8"1@(I"\````3V?B68!GZ)"\````'6<`_UJ0O`````EG`/\4L
  644. XM8-Q2K?_\("W__+"M``AM`/[22JR`!F820JR``DAZ`I%(;((J3KH'?%!/2&R"9
  645. XM*DZZ`RA83^>`T+P```!5.4"`%B`\```"@#(L@!9(P9"!<@).N@A0.4"`$D*G/
  646. XM2'H"6TZZ"V)03RE`@HI*K(`.9APO+("23KH"Y%A/+P`O+("2+RR"@DZZ"KY/*
  647. XM[P`,3KK]>$J`9C9*K(`.9C!(>``<2'H"*R\L@H).N@J<3^\`#"\L@I9.N@JZ9
  648. XM6$\O+(**3KH*L%A/0J=.N@B&6$](;(`23KH+I%A/*4""CDJL@HYF"DAZ`@A.*
  649. XMNOR06$]*K(`.9APO+("63KH"9EA/+P`O+("6+RR"@DZZ"D!/[P`,2'K[)DAXY
  650. XM_[@O+(*63KH*T$_O``P@;(*.(F@`5G``$"D`#W(!X:$O`4ZZ"MA83R!L@HXO+
  651. XM*`!63KH*<EA/*4""AB\L@H9.N@J(6$\@;(*&#*@```(``!1F"DAZ`9U.NOP,\
  652. XM6$\@;(*&#*@`(````!1F``":2'H!G4AL@=I.N@'$4$]"K?_\8"YR"B`M__Q.(
  653. XMN@D^0>R!=M"(+P!(;(':3KH%_%!/2'H!>DAL@=I.N@7N4$]2K?_\("W__+"LG
  654. XM@`9ER$AL@=HO+(*.3KH*KE!/(&R"CB)H`%9P`!`I``]R`>&A+P%.N@H@6$](&
  655. XM;((J+RR"CDZZ"H903R!L@HXO*`!63KH)K%A/+P!.N@G(6$]@`/\(3EU.=4ENB
  656. XM<W1A;&QI;F<@3F]$96QE=&4N+BX`9&]N92X@3F]$96QE=&4@5C$N-$4@J2!(;
  657. XM;V]V97)3;V9T(#$Y.3`*"@!D;W,N;&EB<F%R>0!.;T1E;&5T92!6,2XT12"I>
  658. XM($AO;W9E<E-O9G0`4V]R<GDL(&]N;'D@,3`@97AT96YS:6]N<R!A;&QO=V5D5
  659. XM(0H`($585"!3150`($Y/($585`!I;G1U:71I;VXN;&EB<F%R>0!.;T1E;&5T'
  660. XM92!A;')E861Y(&EN<W1A;&QE9"X*`$-O=6QD(&YO="!O<&5N(%=I;F1O=RX*)
  661. XM"@!.;T1E;&5T92!6,2XT12!E>&ET:6YG+@H*`$5X=&5N<VEO;G,Z(``@`"!O[
  662. XM``0B2$H89OQ3B!`O``NSR&<(L"!F^"`(3G5P`$YU(&\`!"`((F\`"!#99OQ.Z
  663. XM=2!O``0@"$H89OR1P"`(4X!.=4Y5``!(YPP@)&T`"`P2`"!G!@P2``EF!%**R
  664. XM8/!Z``P2`"UF!GH!4HI@"`P2`"MF`E**>`!@("!*4HH0$$B`2,!R"B\`(`1.8
  665. XMN@<B(A_2@"@!F+P````P$!)(@$C`0>R`FP@P``((`&;.2H5G!B`$1(!@`B`$]
  666. XM3-\$,$Y=3G4P/'__8`0P+P`.4T!K%"!O``0B;P`(L0EF#%-(2AA7R/_V<`!.!
  667. XM=6,$<`%.=7#_3G5A<$/L@29%[($FM<EF#C(\`')K"'0`(L)1R?_\*4^"GBQXO
  668. XM``0I3H*B2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH*4""?
  669. XMIF8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4Y51
  670. XM```O"DAY``$``#`L@1S!_``&+P!.N@;4*4""JE!/9A1"ITAY``$``$ZZ!IA07
  671. XM3RYL@IY.=2!L@JI":``$(&R"JC%\``$`$"!L@JHQ?``!``H@;(*>("R"GI"HH
  672. XM``10@"E`@JX@;(*N(+Q-04Y80J=.N@:,)$!*J@"L6$]G,"\M``PO+0`(+PI.1
  673. XMN@"R*7P````!@K(@;(*J`&B````$(&R"J@!H@```"D_O``Q@0DAJ`%Q.N@;2N
  674. XM2&H`7$ZZ!FHI0(*V(&R"MDJH`"103V<0(&R"MB)H`"0O$4ZZ!9I83R\L@K8O9
  675. XM"DZZ`G@I;(*V@KI03TZZ!8X@;(*J((!.N@6>(&R"JB%```9G%DAX`^U(>@`L,
  676. XM3KH%=B!L@JHA0``,4$\O+(*Z+RR"ODZZ^&)"ITZZ`XQ/[P`,)%].74YU*@!..
  677. XM50``2.<,,"1M`!`@;0`(2J@`K&<8(&T`""`H`*SE@"@`($0@*``0Y8`F0&`$4
  678. XM)FR!'A`32(!(P-"M``Q4@"E`@L)"IR\L@L).N@5F*4""QE!/9@A,WPPP3EU.'
  679. XM=1`32(!(P"H`+P4@2U*(+P@O+(+&3KH!CB!L@L;1Q4/Z`5@0V6;\+RT`#"\*H
  680. XM+RR"QDZZ`4X@;(+&0C!8`"E\`````8*^(&R"QM'%)DA2BR1+3^\`&!`32(!(K
  681. XMP"H`L+P````@9R"ZO`````EG&+J\````#&<0NKP````-9PBZO`````IF!%*+M
  682. XM8,P,$P`@;0``C`P3`")F,E*+($M2BQ`02(!(P"H`9R`@2E**$(6ZO````")F<
  683. XM$`P3`")F!%*+8`9"*O__8`)@TF!$($M2BQ`02(!(P"H`9S"ZO````"!G*+J\T
  684. XM````"6<@NKP````,9QBZO`````UG$+J\````"F<(($I2BA"%8,(@2E**0A!*9
  685. XMA68"4XM2K(*^8`#_/$(20J<@+(*^4H#E@"\`3KH$*BE`@KI03V8(0JR"OF``)
  686. XM_KYZ`"9L@L9@'B`%Y8`@;(*Z(8L(`"!+(`A*&&;\D<!3B%*(U\A2A;JL@KYMZ
  687. XMW"`%Y8`@;(*Z0K`(`&``_H(@`#`\?_]@!#`O``X@;P`$2AAF_%-((F\`"%-`!
  688. XM$-E7R/_\9P)"$"`O``1.=4SO`P``!"`((B\`#&`"$-E7R?_\9P9206`"0AA1.
  689. XMR?_\3G5.50``2.<.,"1M``A"ITAZ`(Y.N@/$*4""RE!/9@A,WPQP3EU.=2!M<
  690. XM``PB:``D+RD`!$ZZ!!HH`%A/9U)(>@!M($0O*``V3KH#["9`2H!03V<T2'@#(
  691. XM[2\+3KH"T"P`4$]G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(>@`X3KH"K"5`V
  692. XM`*!03R\$3KH#N%A/+RR"RDZZ`NI"K(+*6$]@@&EC;VXN;&EB<F%R>0!724Y$V
  693. XM3U<`*@!(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?`!)*@$YU2
  694. XM2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O`6$&(A]*3
  695. XM@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!3-\`#$YU7
  696. XM2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.50``2JR"T
  697. XMSF<&(&R"SDZ0+RT`"$ZZ``A83TY=3G5.5?_\+P0K;0`(__Q*K(*J9RQX`&`*!
  698. XM+P1.N@#\6$]2A#`L@1Q(P+B`;>PP+($<P?P`!B\`+RR"JDZZ`@!03TJL@M)G2
  699. XM!B!L@M).D$JL@2)G"B\L@2).N@%T6$]*K(+69P@@;(+6(*R"VDJL@MYG"B\L;
  700. XM@MY.N@&46$]*K(+B9PHO+(+B3KH!A%A/2JR"YF<*+RR"YDZZ`7183TJL@NIGA
  701. XM"B\L@NI.N@%D6$\L>``$""X`!`$I9Q0O#4OZ``I.KO_B*E]@!D*G\U].<TJLU
  702. XM@K9F*DJL@L9G(B\L@L(O+(+&3KH!7"`L@KY2@.6`+P`O+(*Z3KH!2D_O`!!@`
  703. XM#DZZ`3@O+(*V3KH!<%A/("W__"YL@IY.=2@?3EU.=4Y5``!(YPX@*"T`"'(&1
  704. XM(`1.N@!$)$#5[(*J2H1M#C`L@1Q(P+B`;`1*DF82*7P````"@NYP_TS?!'!.Z
  705. XM74YU,"H`!,!\@`!F""\23KH`+EA/0I)P`&#@2.=P`#0!Q,`F`4A#QL!(0T)#J
  706. XMU(-(0,#!2$!"0-""3-\`#DYU(B\`!"QL@J9.[O_<(B\`!"QL@J9.[O^"+&R"0
  707. XMID[N_\I,[P`&``0L;(*F3N[_XD[Z``(L;(*F3N[_Q$[Z``(B+P`$+&R"ID[NQ
  708. XM_Z9.^@`"3.\`#@`$+&R"ID[N_]!(YP$$3.\@@``,+&R"HDZN_Y1,WR"`3G5.)
  709. XM^@`"(F\`!"QL@J).[OYB3.\``P`$+&R"HD[N_SI.^@`"(F\`!"QL@J).[O[:+
  710. XM+&R"HD[N_WPB;P`$("\`""QL@J).[O\N3OH``B!O``0L;(*B3N[^C$[Z``(L9
  711. XM;(*B(F\`!"`O``A.[OW83OH``B)O``0L;(*B3N[^AB)O``0@;P`(("\`#"QL'
  712. XM@J).[OY<(F\`!"`O``@L;(*B3N[^U"`O``0L;(*B3N[^PB!O``0L;(*B3N[^$
  713. XM@$SO`P``!"QL@LI.[O^@(&\`!"QL@LI.[O^F(&\`!"QL@LI.[O^R2.<`,$SO7
  714. XM#P``#$SO``\`'"QL@HI.KOZD3-\,`$YU(&\`!"QL@HI.[O^X(&\`!"QL@HI.L
  715. XM[O\T+PI,[P<```@L;(**3J[^["1?3G4``````^P````!`````0``")H`````'
  716. XM```#\@```^H```!)``````````````````````!D```!7@`*``$`(`(`````;
  717. XM3@`````````````"*`````````````4`!0*``&X``0$``@``'@`0````````D
  718. XM`````````0`"```>``4`````````!````$`!``(```8``P`````````D````:
  719. XM``$``@``!@`#`````````#(````````&*@``!D$`("`@("`@("`@,#`P,#`@E
  720. XM("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`H
  721. XM0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("*
  722. XM`@("`@("`@("`@("`@("`@("0$!`0"```!0``````````````^P````"````)
  723. XM`0```"H```!D````!0````````!@````=````(@```"0````E`````````/R)
  724. X,```#ZP````$```/RD
  725. X``
  726. Xend
  727. Xsize 4692
  728. END_OF_FILE
  729. if test 6607 -ne `wc -c <'nodelete.uu'`; then
  730.     echo shar: \"'nodelete.uu'\" unpacked with wrong size!
  731. fi
  732. # end of 'nodelete.uu'
  733. fi
  734. echo shar: End of archive 1 \(of 1\).
  735. cp /dev/null ark1isdone
  736. MISSING=""
  737. for I in 1 ; do
  738.     if test ! -f ark${I}isdone ; then
  739.     MISSING="${MISSING} ${I}"
  740.     fi
  741. done
  742. if test "${MISSING}" = "" ; then
  743.     echo You have the archive.
  744.     rm -f ark[1-9]isdone
  745. else
  746.     echo You still need to unpack the following archives:
  747.     echo "        " ${MISSING}
  748. fi
  749. ##  End of shell archive.
  750. exit 0
  751. -- 
  752. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  753. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  754. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  755.